# Домашнее задание к занятию "`Репликация и масштабирование. Часть 2`" - `Исаенков Евгений`

---

### Задание 1

Задание 1
Опишите основные преимущества использования масштабирования методами:
- активный master-сервер и пассивный репликационный slave-сервер;
- master-сервер и несколько slave-серверов;
- активный сервер со специальным механизмом репликации — distributed replicated block device (DRBD);
- SAN-кластер.

Дайте ответ в свободной форме.

### Ответ

1. **Активный master-сервер и пассивный репликационный slave-сервер**: Это классический вариант для обеспечения высокой доступности. Основное преимущество здесь в том, что если основной сервер упадет, пассивный сервер может быстро взять на себя его функции. Это обеспечивает непрерывность работы сервиса без значительных потерь данных.

2. **Master-сервер и несколько slave-серверов**: Такая схема позволяет распределять нагрузку чтения между несколькими серверами, что существенно увеличивает производительность системы при чтении. Это особенно актуально для приложений, где операций чтения намного больше, чем записи.

3. **Активный сервер со специальным механизмом репликации — DRBD (Distributed Replicated Block Device)**: DRBD позволяет реплицировать данные на уровне блочных устройств в реальном времени между серверами. Это обеспечивает высокий уровень отказоустойчивости и доступности данных. Главное преимущество здесь в том, что DRBD может быть использован для любых типов данных и файловых систем, делая его универсальным решением для синхронной репликации.

4. **SAN-кластер (Storage Area Network)**: SAN обеспечивает высокоскоростной доступ к блочному хранилищу данных через сеть. Главные преимущества здесь в масштабируемости и гибкости управления данными. SAN позволяет множеству серверов доступ к общему пулу хранилища, что упрощает управление данными и резервное копирование, а также повышает общую производительность за счет распределения нагрузки.

Каждый из этих методов масштабирования имеет свои особенности и лучше всего подходит для определенных сценариев использования. Выбор зависит от конкретных требований к доступности, производительности и отказоустойчивости системы.

---

### Задание 2

Разработайте план для выполнения горизонтального и вертикального шаринга базы данных. База данных состоит из трёх таблиц:
- пользователи,
- книги,
- магазины (столбцы произвольно).
Опишите принципы построения системы и их разграничение или разбивку между базами данных.

Пришлите блоксхему, где и что будет располагаться. Опишите, в каких режимах будут работать сервера.

### Ответ

- **Горизонтальный шардинг (шардирование)** подразумевает разделение одной и той же таблицы на разные базы данных (или сервера), где каждая часть содержит уникальный набор данных. Это помогает распределить нагрузку и увеличить производительность при обработке больших объемов данных.

- **Вертикальный шардинг** подразумевает разделение таблицы или базы данных на части по столбцам. Каждая часть переносится в отдельную базу данных, что позволяет оптимизировать хранение и доступ к данным.

Для базы данных с таблицами **пользователи**, **книги**, и **магазины**, вот как может выглядеть план для горизонтального и вертикального шаринга:

### Горизонтальный шардинг:

```diff
+------------------+    +------------------+    +------------------+
|    User Shard 1  |    |    User Shard 2  |    |    User Shard N  |
+------------------+    +------------------+    +------------------+
| user_id (1-1000) |    | user_id (1001-2000)|  | user_id (N-N+1000)|
| name             |    | name                 |  | name             |
| rules            |    | rules                |  | rules            |
| password         |    | password             |  | password         |
| id_book          |    | id_book              |  | id_book          |
+------------------+    +------------------+    +------------------+

+------------------+    +------------------+    +------------------+
|   Books Shard 1  |    |   Books Shard 2  |    |   Books Shard N  |
+------------------+    +------------------+    +------------------+
| id_book (1-1000) |    | id_book (1001-2000)|  | id_book (N-N+1000)|
| name_books       |    | name_books           |  | name_books       |
| author           |    | author               |  | author           |
| year             |    | year                 |  | year             |
+------------------+    +------------------+    +------------------+

+-------------------+    +-------------------+    +-------------------+
|    Store Shard 1  |    |    Store Shard 2  |    |    Store Shard N  |
+-------------------+    +-------------------+    +-------------------+
| id_store (1-100)  |    | id_store (101-200)|    | id_store (N-N+100)|
| name_store        |    | name_store        |    | name_store        |
| location          |    | location          |    | location          |
| manager_id        |    | manager_id        |    | manager_id        |
+-------------------+    +-------------------+    +-------------------+
```


### Вертикальный шардинг:

```diff
+--------------+    +-----------------+    +-----------------+
| User Info    |    | User Security   |    | User Books      |
+--------------+    +-----------------+    +-----------------+
| user_id      |    | user_id         |    | user_id         |
| name         |    | password        |    | id_book         |
| rules        |    |                 |    |                 |
+--------------+    +-----------------+    +-----------------+

+--------------+    +-----------------+    +-----------------+
| Books Info   |    | Books Author    |    | Books Year      |
+--------------+    +-----------------+    +-----------------+
| id_book      |    | id_book         |    | id_book         |
| name_books   |    | author          |    | year            |
+--------------+    +-----------------+    +-----------------+

+-----------------+    +---------------------+    +-------------------+
| Store Info      |    | Store Location      |    | Store Management  |
+-----------------+    +---------------------+    +-------------------+
| id_store        |    | id_store            |    | id_store          |
| name_store      |    | location            |    | manager_id        |
+-----------------+    +---------------------+    +-------------------+
```

В блок-схемах выше:

- **Для горизонтального шардинга**, таблицы разделяются на шарды по определенным критериям. В нашем примере id, но возможно и по географическому признаку (если применим) или размеру магазина, что позволяет распределять данные и запросы между несколькими серверами для повышения производительности и масштабируемости.

- **Для вертикального шардинга**, каждая таблица разделяется на отдельные столбцы или группы столбцов, которые могут быть вынесены в отдельные базы данных. Это позволяет оптимизировать хранение данных и ускорить доступ к ним, так как запросы могут быть направлены непосредственно к нужной части данных.

Такая структура позволяет более гибко управлять нагрузкой и масштабировать систему по мере необходимости.

---

### Задание 3 *

Выполните настройку выбранных методов шардинга из задания 2.

Пришлите конфиг Docker и SQL скрипт с командами для базы данных.

### Ответ

---
